package edu.northwestern.cbits.purple_robot_manager.probes.features; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; import android.content.Context; import android.os.Bundle; import edu.northwestern.cbits.purple_robot_manager.R; public abstract class XYZBasicStatisticsFeature extends XYZContinuousProbeFeature { private long _lastCheck = 0; private boolean _running = false; protected void analyzeBuffers(final Context context) { final long now = System.currentTimeMillis(); if (now - this._lastCheck > 10000 && this._running == false) { this._lastCheck = now; final XYZBasicStatisticsFeature me = this; Runnable r = new Runnable() { public void run() { me._running = true; Bundle data = new Bundle(); data.putDouble("TIMESTAMP", now / 1000); data.putString("PROBE", me.name(context)); double maxTime = Double.MIN_VALUE; double minTime = Double.MAX_VALUE; DescriptiveStatistics xStats = new DescriptiveStatistics(XYZContinuousProbeFeature.BUFFER_SIZE); DescriptiveStatistics yStats = new DescriptiveStatistics(XYZContinuousProbeFeature.BUFFER_SIZE); DescriptiveStatistics zStats = new DescriptiveStatistics(XYZContinuousProbeFeature.BUFFER_SIZE); for (int i = 0; i < XYZContinuousProbeFeature.BUFFER_SIZE; i++) { xStats.addValue(me.x[i]); yStats.addValue(me.y[i]); zStats.addValue(me.z[i]); if (me.timestamp[i] > maxTime) maxTime = me.timestamp[i]; if (me.timestamp[i] < minTime) minTime = me.timestamp[i]; } data.putDouble("X_MIN", xStats.getMin()); data.putDouble("X_MAX", xStats.getMax()); data.putDouble("X_MEAN", xStats.getMean()); data.putDouble("X_STD_DEV", xStats.getStandardDeviation()); data.putDouble("X_RMS", Math.sqrt(xStats.getSumsq() / XYZContinuousProbeFeature.BUFFER_SIZE)); data.putDouble("Y_MIN", yStats.getMin()); data.putDouble("Y_MAX", yStats.getMax()); data.putDouble("Y_MEAN", yStats.getMean()); data.putDouble("Y_STD_DEV", yStats.getStandardDeviation()); data.putDouble("Y_RMS", Math.sqrt(yStats.getSumsq() / XYZContinuousProbeFeature.BUFFER_SIZE)); data.putDouble("Z_MIN", zStats.getMin()); data.putDouble("Z_MAX", zStats.getMax()); data.putDouble("Z_MEAN", zStats.getMean()); data.putDouble("Z_STD_DEV", zStats.getStandardDeviation()); data.putDouble("Z_RMS", Math.sqrt(zStats.getSumsq() / XYZContinuousProbeFeature.BUFFER_SIZE)); data.putInt("BUFFER_SIZE", XYZContinuousProbeFeature.BUFFER_SIZE); data.putDouble("FREQUENCY", ((double) XYZContinuousProbeFeature.BUFFER_SIZE) / ((maxTime - minTime) / 1000)); data.putDouble("DURATION", ((maxTime - minTime) / 1000.0)); me.transmitData(context, data); me._running = false; } }; Thread t = new Thread(r); t.start(); } } public String summarizeValue(Context context, Bundle bundle) { double x = bundle.getDouble("X_STD_DEV"); double y = bundle.getDouble("Y_STD_DEV"); double z = bundle.getDouble("Z_STD_DEV"); return String .format(context.getResources().getString(R.string.summary_accelerator_statistics_feature), x, y, z); } protected abstract String featureKey(); public abstract String summary(Context context); public abstract String name(Context context); public abstract String source(Context context); public abstract String title(Context context); }